package implementacion;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;

import clasesAuxiliares.RutaFichero;
import excepciones.ElementoEnConjunto;
import excepciones.NoElementoEnConjunto;

public class Rutas {

	private EntityManager em;

	public Rutas(EntityManager em) {
		this.em = em;

	}

	public void anyadirRuta(Ruta ruta) {
		if (ruta != null && !existeNombreRuta(ruta.getNombre()))
			em.persist(ruta);
		else
			throw new ElementoEnConjunto(
					"Ya existe una Ruta con el mismo nombre");
	}

	private boolean existeNombreRuta(String nombreRuta) {
		if (buscarRuta(nombreRuta) == null)
			return false;
		else
			return true;
	}

	public void eliminarRuta(Long idRuta) {
		if (!idRuta.equals("")) {
			Ruta ruta = em.find(Ruta.class, idRuta);
			if (ruta != null) {
				String query = "SELECT infoRuta FROM InfoRuta infoRuta WHERE infoRuta.ruta='"
						+ ruta.getIdRuta() + "'";
				List<InfoRuta> infoRutas = em
						.createQuery(query, InfoRuta.class).getResultList();
				for (InfoRuta infoRuta : infoRutas) {
					InfoRutas infoRutasAux = new InfoRutas(em);
					infoRutasAux.eliminarInfoRuta(infoRuta.getIdInfoRuta());
				}
				String query2 = "SELECT comentario FROM Comentario comentario WHERE comentario.ruta='"
						+ ruta.getIdRuta() + "'";
				List<Comentario> comentarios = em
						.createQuery(query2, Comentario.class).getResultList();
				for (Comentario comentario : comentarios) {
					Comentarios comentariosAux = new Comentarios(em);
					comentariosAux.eliminarComentario(comentario.getIdComentario());
				}
				em.remove(ruta);
			} else
				throw new NoElementoEnConjunto(
						"No existe dicha Ruta en la base de datos");
		} else
			throw new IllegalArgumentException();
	}

	private Ruta buscarRuta(String nombreRuta) {
		Ruta ruta;
		String query = "SELECT ruta FROM Ruta ruta WHERE ruta.nombre='"
				+ nombreRuta + "'";
		TypedQuery<Ruta> resultado = em.createQuery(query, Ruta.class);
		try {
			ruta = resultado.getSingleResult();
		} catch (Exception e) {
			return null;
		}
		return ruta;
	}

	public List<Ruta> buscarRutas(String cadena) {
		List<Ruta> coincidencias = new ArrayList<Ruta>();
		String query = "SELECT ruta FROM Ruta ruta";
		List<Ruta> rutas = (ArrayList<Ruta>) em.createQuery(query, Ruta.class)
				.getResultList();
		for (Ruta ruta : rutas)
			if (ruta.getNombre().contains(cadena))
				coincidencias.add(ruta);
		return coincidencias;
	}

	public RutaFichero obtenerDatosRutaConFichero(long idRuta) {
		Ruta ruta;
		if (idRuta != -1) {
			ruta = em.find(Ruta.class, idRuta);
			RutaFichero rutaFichero = new RutaFichero(ruta);
			return rutaFichero;
		} else
			throw new IllegalArgumentException();
	}
}
